package br.com.unirio.formula1.modelo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * Classe singleton que armazena todos os objetos criados.
 * 
 * Composta de Sets de :
 * 
 * {@link Equipe}, {@link Piloto}, {@link Corrida} e {@link Resultado}
 * 
 * 
 * @author Victor
 * 
 */
public class Campeonato implements Serializable
{

    private Set<Equipe> equipes;
    private Set<Piloto> pilotos;
    private Set<Corrida> corridas;
    private Set<Resultado> resultados;

    public Campeonato()
    {
	equipes = new HashSet<Equipe>();
	pilotos = new HashSet<Piloto>();
	corridas = new HashSet<Corrida>();
	resultados = new HashSet<Resultado>();

    }

    public boolean isEmpty()
    {
	if (equipes.isEmpty() && corridas.isEmpty() && pilotos.isEmpty())
	    return true;
	return false;
    }

    public Set<Equipe> getEquipes()
    {
	return equipes;
    }

    public void setEquipes(Set<Equipe> equipes)
    {
	this.equipes = equipes;
    }

    public Set<Piloto> getPilotos()
    {
	return pilotos;
    }

    public void setPilotos(Set<Piloto> pilotos)
    {
	this.pilotos = pilotos;

    }

    public Set<Corrida> getCorridas()
    {
	return corridas;
    }

    public void setCorridas(Set<Corrida> corridas)
    {

	this.corridas = corridas;
    }

    public Set<Resultado> getResultados()
    {
	return resultados;
    }

    public void setResultados(Set<Resultado> resultados)
    {

	this.resultados = resultados;
    }

    public void addEquipe(Equipe equipe)
    {
	if (equipes == null)
	    equipes = new HashSet<Equipe>();
	equipes.add(equipe);
    }

    public void removeEquipe(Equipe equipe)
    {
	equipes.remove(equipe);

    }

    public void addPiloto(Piloto piloto)
    {
	if (pilotos == null)
	    pilotos = new HashSet<Piloto>();
	pilotos.add(piloto);

    }

    public void removePiloto(Piloto piloto)
    {
	pilotos.remove(piloto);

    }

    public void addResultado(Resultado resultado)
    {
	if (resultados == null)
	    resultados = new HashSet<Resultado>();
	resultados.add(resultado);
    }

    public void removeResultado(Resultado resultado)
    {
	resultados.remove(resultado);
    }

    public void addCorrida(Corrida corrida)
    {
	if (corridas == null)
	    corridas = new HashSet<Corrida>();
	corridas.add(corrida);
    }

    public void removeCorrida(Corrida corrida)
    {
	corridas.remove(corrida);
    }

    // / METODOS DE BUSCA DE OBJETOS ///

    /**
     * Metodo que busca uma corrida por seu id, retornando null caso nao exista tal corrida.
     * 
     * @param id
     *            - id da corrida a ser buscada
     * @return - corrida recuperada ou null caso nao exista
     */
    public Corrida getCorridaById(int id)
    {
	for (Corrida corrida : corridas)
	{
	    if (corrida.getId() == id)
		return corrida;

	}
	return null;
    }

    /**
     * Metodo que busca um piloto por seu id, retornando null caso nao exista tal piloto.
     * 
     * @param id
     *            - id do piloto a ser buscado
     * @return - piloto recuperado ou null caso nao exista
     */
    public Piloto getPilotoById(int id)
    {
	for (Piloto piloto : pilotos)
	{
	    if (piloto.getId() == id)
		return piloto;

	}
	return null;
    }

    /**
     * Metodo que verifica se existe uma corrida com o id passado por parametro.
     * 
     * @param idCorrida
     *            - id da corrida
     * @return - true caso exista ou false caso nao exista
     */
    public boolean existeResultado(int idCorrida)
    {
	if (resultados == null)
	    return false;
	for (Resultado resultado : resultados)
	{
	    if (resultado.getCorrida().getId() == idCorrida)
		return true;
	}
	return false;

    }

    /**
     * Metodo que verifica se existe um piloto com o id passado por parametro
     * 
     * @param idPiloto
     *            - id do piloto
     * @return - true caso exista ou falso caso nao exista
     */
    public boolean existePiloto(int idPiloto)
    {
	for (Piloto piloto : pilotos)
	{
	    if (piloto.getId() == idPiloto)
		return true;
	}
	return false;

    }

    /**
     * Procura uma Equipe pelo nome da mesma, caso nao seja encontrada, retorna null
     * 
     * @param nome
     * @return
     */
    public Equipe getEquipePeloNome(String nome)
    {
	for (Equipe equipe : equipes)
	{
	    if (equipe.getNome().equals(nome))
		return equipe;

	}
	return null;
    }

    public boolean existeCorrida(int id)
    {
	for (Corrida corrida : corridas)
	{
	    if (corrida.getId() == id)
		return true;
	}
	return false;

    }

    public void apagarEquipesEPilotos()
    {
	pilotos.clear();
	equipes.clear();

    }

    public void apagarCorridas()
    {
	corridas.clear();

    }

    public void apagarResultados()
    {
	resultados.clear();
    }

    public Resultado getResultadoPeloId(int idCorrida)
    {
	for (Resultado resultado : resultados)
	{
	    if (resultado.getCorrida().getId() == idCorrida)
		return resultado;
	}
	return null;
    }

}
